//
//  InitializationTest.swift
//  BJ12366Swift
//
//  Created by ZRAR on 16/2/26.
//  Copyright © 2016年 ZRAR. All rights reserved.
//

import UIKit

class InitializationTest: NSObject {
    //结构体的逐一成员构造器
    //如果结构体对所有存储属性提供了默认且自身没有提供制定的构造器，他们能自动获得一个逐一成员构造器
    struct Size {
        
        var width = 0.0, height = 0.0
        
    }
    let twobyTwo = Size(width: 1, height: 2)
    struct Point {
        var x = 0.0, y = 0.0
    }
    
    struct Rect {
        var origin = Point()
        var size = Size()
        init(){}
        init(origin:Point,size:Size){
            
            self.origin = origin
            self.size = size
        }
        init(center:Point,size:Size){
            
            let oringx = center.x - (size.width/2)
            let oringy = center.y - (size.height/2)
            self.init(origin:Point(x: oringx, y: oringy),size:size)
        }
    }
    let rect = Rect()
    //指定构造器和便利构造器
    //规则，指定构造器必须总是向上代理，便利构造器必须总是横向代理
    //自动构造器的继承，如果子类没有定义任何指定构造器，它将继承所有父类的指定构造器
    //如果子类提供了所有父类指定构造器的实现——不管是通过规则1继承过来的，还是通过自定义实现的，它将自动继承所有父类的便利构造器
    
    
    
    
    //可失败构造器：给构造器传入无效的参数，或缺少某种所需的外部资源，又或是不满足某种必要条件等
    //处理方式，可以在一个类，结构体或者枚举的定义中，添加一个或多个可失败构造器，其语法为在init后面加？
    //通过reture nil 语句，来表明可失败构造器在何种情况下“失败”
    
    struct Animal {
        let species:String
        init?(species:String){
            
            if species.isEmpty {return nil}
            self.species = species;
        }
        
    }
    
    let someCreature = Animal(species: "Giraffe")
    let anonymousCreature = Animal(species: "")
    //anonymousCreature的类型是Animal?,而不是Animal
    enum TemperatureUnit{
        
        case Kelvin,Celsius,Fahrenheit
        init?(symbol:Character){
            
            switch symbol{
                
            case "K":
                self = .Kelvin
            case "C":
                self = .Celsius
            case "F":
                self = .Fahrenheit
            default:
                return nil
                
            }
            
        }
        
        
    }
    let fahrenheitUnit = TemperatureUnit(symbol: "F")
    //上面的代码也可以简化为
    enum TemperatureUnit2:Character{
        case Kelvin = "K",Celsius = "C",Fahrenheit = "F"
   }
    
    //类的可失败构造器
    class Product {
        
        let name:String!
        init?(name:String){
            self.name = name
            if name.isEmpty{return nil}
        }
    }
    //必要构造器,关键字required
    
    //通过闭包和函数来设置属性的默认值
    class SomeClass {
        
        let someProperty:String = {
            
            
           return "zxh"
        }()
        
    }
    
    
}
